package com.xxxtea.controller;

import cn.hutool.core.bean.BeanUtil;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.xxxtea.common.MerchantContext;
import com.xxxtea.common.Result;
import com.xxxtea.common.UserContext;
import com.xxxtea.dto.Location;
import com.xxxtea.dto.PageQuery;
import com.xxxtea.entity.Merchant;
import com.xxxtea.entity.User;
import com.xxxtea.sdk.amap.AmapClient;
import com.xxxtea.service.MerchantService;
import com.xxxtea.service.UserService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.*;

import javax.annotation.Resource;
import java.util.List;

/**
 * 商家管理控制器
 * 
 * 提供商家相关的管理功能，包括：
 * - 获取当前登录商家信息
 * - 新增商家（同时创建用户账号）
 * - 删除商家
 * - 更新商家信息
 * - 查询商家详情
 * - 获取商家列表
 * - 分页查询商家（支持距离计算）
 * 
 * @author xxxtea
 * @version 1.0
 * @since 2024-01-01
 */
@Slf4j
@Api("商家接口")
@RestController
@RequestMapping("/merchant")
public class MerchantController {
	
	/**
	 * 高德地图客户端，用于计算距离
	 */
	@Resource
	private AmapClient amapClient;
	
	/**
	 * 用户服务
	 */
	@Resource
	private UserService userService;
	
	/**
	 * 商家服务
	 */
	@Resource
	private MerchantService merchantService;

	/**
	 * 获取当前登录商家信息
	 * 
	 * @return 当前商家信息
	 */
	@GetMapping("/current")
	@ApiOperation("获取登录商家信息")
	public Result<Merchant> current() {
		return Result.success(MerchantContext.getMerchant());
	}

	/**
	 * 新增商家
	 * 同时创建用户账号，设置角色为商家
	 * 
	 * @param request 商家信息
	 * @return 操作结果
	 */
	@PostMapping
	@ApiOperation("新增商家")
	public Result<String> save(@RequestBody Merchant request) {
		// 复制商家信息到用户对象
		User user = BeanUtil.copyProperties(request, User.class);
		// 设置用户角色为商家
		user.setRole(User.Role.MERCHANT);
		// 保存用户信息
		userService.save(user);
		// 设置商家关联的用户ID
		request.setUserId(user.getId());
		// 保存商家信息
		if (!merchantService.save(request)) {
			return Result.error("添加失败!");
		}
		return Result.success();
	}

	/**
	 * 根据ID删除商家
	 * 
	 * @param id 商家ID
	 * @return 操作结果
	 */
	@DeleteMapping("/{id}")
	@ApiOperation("删除商家")
	public Result<String> delete(@PathVariable String id) {
		// 调用服务层删除商家
		if (!merchantService.removeById(id)) {
			return Result.error("删除失败!");
		}
		return Result.success();
	}

	/**
	 * 更新商家信息
	 * 
	 * @param request 更新的商家信息
	 * @return 操作结果
	 */
	@PutMapping
	@ApiOperation("更新商家")
	public Result<String> update(@RequestBody Merchant request) {
		// 调用服务层更新商家信息
		if (!merchantService.updateById(request)) {
			return Result.error("更新失败!");
		}
		return Result.success();
	}

	/**
	 * 根据ID获取单个商家详情
	 * 
	 * @param id 商家ID
	 * @return 商家详情
	 */
	@GetMapping("/{id}")
	@ApiOperation("获取单个商家")
	public Result<Merchant> getOne(@PathVariable String id) {
		return Result.success(merchantService.getById(id));
	}

	/**
	 * 获取商家列表
	 * 支持条件查询
	 * 
	 * @param request 查询条件
	 * @return 商家列表
	 */
	@GetMapping("/list")
	@ApiOperation("获取商家列表")
	public Result<List<Merchant>> list(Merchant request) {
		// 构建查询条件
		LambdaQueryWrapper<Merchant> wrapper = new LambdaQueryWrapper<>(request);
		return Result.success(merchantService.list(wrapper));
	}

	/**
	 * 分页查询商家
	 * 支持条件查询和分页，可选择计算距离
	 * 
	 * @param request 分页查询条件
	 * @return 分页结果
	 */
	@PostMapping("/page")
	@ApiOperation("分页查询商家")
	public Result<Page<Merchant>> page(@RequestBody PageQuery<Merchant> request) {
		// 分页查询
		Merchant param = request.getParam();
		LambdaQueryWrapper<Merchant> wrapper = new LambdaQueryWrapper<>(param);
		Page<Merchant> pageResult = merchantService.page(request.toPage(), wrapper);
		
		// 如果需要计算距离，为每个商家计算到用户当前位置的距离
		for (Merchant record : pageResult.getRecords()) {
			if (param.isCalDistance()) {
				// 获取商家位置
				Location originLocation = record.getLocation();
				// 获取用户当前位置
				Location userLocation = UserContext.getUser().getLocation();
				// 计算距离并设置到商家对象中
				record.setDistance(amapClient.distanceKm(originLocation, userLocation));
			}
		}
		return Result.success(pageResult);
	}
}
